package com.yanxu.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

import static org.springframework.security.config.Customizer.withDefaults;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2025-09-26-2025
 * @Description: security 配置类
 */
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        //authorizeRequests()：开启授权保护
        //anyRequest()：对所有请求开启授权保护
        //authenticated()：已认证请求会自动被授权
        http
                .authorizeRequests(
                        authorize ->
                                //anyRequest: 对所有请求，开启授权保护。 （开启授权保护的情况下，如果用户没有认证，用户就会被跳转到登录页）
                                //authenticated: 对于已认证的请求会被自动授权
                                authorize.anyRequest().authenticated()
                )
                //表单授权方式。(springsecurity 有帮助我们生成默认的表单页面)
                .formLogin(withDefaults())

                //基本授权方式 (在没有html 登录页面的时候，会使用浏览器自带的弹框登录)
                //.httpBasic(withDefaults())

                //csrf 攻击防御. (关闭 csrf 攻击)
                .csrf(csrf -> csrf.disable())
                ;

        return http.build();
    }


    // --- UserDetailsService
    // ------ UserDetailsManager
    // ---------- InMemoryUserDetailsManager

    /*@Bean
    public UserDetailsService userDetailsService() {
        //创建基于内存管理用户的 manager
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
        //基于内存，创建内存用户  user - password
        //User user = new User("zhangsan","password",new ArrayList<>());
        inMemoryUserDetailsManager.createUser(
                User.withDefaultPasswordEncoder().
                        username("user").
                        password("password").
                        roles("USER").
                        build()
        );

        //返回  基于内存的用户管理器
        return inMemoryUserDetailsManager;
    }*/


    /* 使用自己定义的 DBUserDetailManager， 不再使用基于内存的 InMemoryUserDetailsManager */
    @Bean
    public UserDetailsManager userDetailsManager() {
        DBUserDetailManager manager = new DBUserDetailManager();
        return manager;
    }
}